/*
 * @Author: spring
 * @version:
 * @Date: 2022-09-12 15:46:55
 * @LastEditors: spring
 * @LastEditTime: 2022-09-18 10:58:55
 * @Descripttion:
 */
#ifndef _SERVICE_H_
#define _SERVICE_H_

/*
 * @Author: spring
 * @version:
 * @Date: 2022-09-07 14:43:10
 * @LastEditors: spring
 * @LastEditTime: 2022-09-12 15:47:45
 * @Descripttion: 服务器主程序
 */
#include <stdlib.h>
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <vector>
#include <pthread.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/tcp.h>
#include "../include/Com_thread.h"
#include "../include/Com_tcp.h"

#include <sys/epoll.h>

using namespace std;

/**
 * @msg: 根据 data_type（命令发送者标识在等待队列中进行查找）
 * @param {int} client_type
 * @return {*}，找到返回下标，没有找到返回-1.
 */
int find_client_iswait(int client_type);

/**
 * @msg: 嗲用accept获取一个通信套接字。
 * @param {int} listenfd
 * @return {*} -1 获取失败，正确返回文件描述符
 */
int accept_comfd(int listenfd);

/**
 * @msg: 向epoll_fd中添加监听文件描述符
 * @param {int} fd
 * @param {uint32_t} events
 * @return {*} 失败程序结束
 */
void epoll_add(int fd, uint32_t events);

/**
 * @msg: 从fd 套接字中获取数据协议头。
 * @param {int} fd，文件描述符
 * @param {head} *top ：头存放位置
 * @return {*} 成功 返回接收的字节数，失败 -1，连接断开0；
 */
int getHead(int fd, head *top);

/**
 * @msg: 向epoll_fd 中移除文件描述符.
 * @param {int} fd
 * @return {*}
 */
void epoll_remove(int fd);

#endif
//_SERVICE_H_